Sealed Class
code:kt
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
sealed classで親を定義し、
data classでそれを継承しながら定義する
パターンマッチができる
code:kt
fun eval(expr: Expr): Double = when (expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
}
他の言語でのイメージ (これらはSealed Classではない)
code:ts
type Expr = Const | Sum;
interface Const { kind: "const", number: number }
interface Sum { kind: "sum", e1: Expr, e2: Expr }
code:hs
data Expr = Const Double | Sum Expr Expr
この比較だけするとどうやってもtsやhsのように|で繋ぐ記法の方が優れている様に見えるmrsekut.icon
classと継承という概念を前提にしてるから、記法が冗長になりがちだし、
Exprの全てのサブクラスをぱっと見でわからない
ファイルの上の方と下の方に書かれている可能性が出てくる
ぱっと見の違いだと、sealed classは後から拡張できるねmrsekut.icon
GPT-4.iconに聞いた話では、Kotlinではサブクラスは同じファイル内でのみ定義できるらしい